package cn.xkai.exercise.a;

import com.google.gson.Gson;

/**
 * @description: 删除排序数组中的重复项
 * 自己的思路：当前值依次比较后面的数，如果发现重复，则把后面的值设置为最大值，如果发现当前值为标识值则与后面一位交换
 * 借鉴的思路：第一个数为基准值，从第二个数开始跟前一个数进行比较重复则记录重复次数，否则把当前值交换到重复值的位置(当前位置-重复数)
 * 心得：自己的思路经过多次交换数据，多次全循环，而借鉴的思路只把未重复的值交换到前面即可
 * @author: kaixiang
 * @date: 2022-06-16
 **/
public class Solution1 {
    public int removeDuplicates(int[] nums) {
        int max = 10001;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] == max && nums[j] != max) {
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                    continue;
                }
                if (nums[i] != nums[j]) {
                    continue;
                }
                nums[j] = max;
            }
        }
        int len = 0;
        for (int num : nums) {
            if (num == max) {
                break;
            }
            len++;
        }
        return len;
    }

    public int removeDuplicatesRefer(int[] nums) {
        //重复的数字个数
        int count = 0;
        for (int right = 1; right < nums.length; right++) {
            if (nums[right] == nums[right - 1]) {
                //如果有重复的，count要加1
                count++;
            } else {
                //如果没有重复，后面的就往前挪
                nums[right - count] = nums[right];
            }
        }
        //数组的长度减去重复的个数
        return nums.length - count;
    }

    public static void main(String[] args) {
        int[] nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        Solution1 solution1 = new Solution1();
        System.out.println(solution1.removeDuplicatesRefer(nums));
        System.out.println(new Gson().toJson(nums));
    }
}
